<?php

include_once ENTITIES."produto.php";
include_once ENTITIES."tipo-produto.php";
include_once ENTITIES."marca.php";

include_once MODELS."produto.php";
include_once MODELS."tipo-produto.php";
include_once MODELS."marca.php";

class ProdutoController {
    
    private $modelProduto;
    private $modelTipo;
    private $modelMarca;
    
    public function __construct() {
        $this->modelProduto = new ProdutoModel();
        $this->modelTipo = new TipoProdutoModel();
        $this->modelMarca = new MarcaModel();
    }
    
    //Ações relevantes ao model de Produtos
    
    public function addProduto(Produto $produto = null){
        if(is_null($produto)){
            $produto = new Produto();
            $this->linkProduto($produto);
        }
        global $config;
        
        if(empty($produto->codigo) || empty($produto->tipo) || empty($produto->marca)){
            $config->failInFunction("Os campos: Código, Tipo e Marca, são necessários para a inserção");
            $config->redirect("?op=cad-prod");
        }
        
        $hasId = $config->filter("for-update-id");
        $res = false;
        
        if(empty($hasId)){
            $res = $this->modelProduto->insert($produto);
        } else {
            $produto->id = $hasId;
            $res = $this->modelProduto->update($produto);
        }
        
        if($res){
            $config->successInFunction();
        } else {
            $config->failInFunction($this->modelProduto->handleError());                
        }
        
        $config->redirect("index.php?op=cad-prod");
    }
    
    private function linkProduto(Produto &$produto){
        global $config;
        $produto->codigo = $config->filter("codigo");
        $produto->descricao = $config->filter("descricao");
        $produto->precoCompra = $config->filter("preco-compra");
        $produto->precoVenda = $config->filter("preco-venda");
        $produto->precoVendaMin = $config->filter("preco-venda-min");
        $produto->tipo = $config->filter("tipo");
        $produto->marca = $config->filter("marca");
    }
    
    public function removerProduto(){
        global $config;
        $id_produto = $config->filter("prod");
        if(isset($id_produto)){
            if($this->modelProduto->delete($id_produto)){
                $config->successInFunction();
            } else {
                $config->failInFunction($this->modelProduto->handleError());
            }    
        } else {
            $config->failInFunction("Produto não informado");
        }
        $config->redirect("?op=cad-prod");
    }
    
    public function getAllProdutos($foreign_values = false){
        if($foreign_values)
            return $this->modelProduto->superSelect ();
        return $this->modelProduto->select();
    }
    
    public function getProduto($id_produto, $foreign_values = false){
        $condition = ProdutoModel::ID." = $id_produto";
        if($foreign_values) $produto = $this->modelProduto->superSelect ($condition);
        else $produto = $this->modelProduto->select("*", $condition);
        if(!empty($produto)) return $produto[0];
        return new Produto();
    }
    
    
    //Ações relevantes ao model de Tipo de Produtos
    
    public function addTipoProduto(TipoProduto $tipo = null){
        if(is_null($tipo)){
            $tipo = new TipoProduto();
            $this->linkTipoProduto($tipo);
        }
        global $config;
        if(empty($tipo->nome)){
            $config->failInFunction("O campo Nome é necessário para inserção");
            $config->redirect("?op=cad-tipo");
        }
        
        $hasId = $config->filter("for-update-id");
        $res = false;
        
        if(empty($hasId)){
            $res = $this->modelTipo->insert($tipo);
        } else {
            $tipo->id = $hasId;
            $res = $this->modelTipo->update($tipo);
        }
        
        if($res){
            $config->successInFunction();
        } else {
            $config->failInFunction($this->modelTipo->handleError());                
        }
        
        $config->redirect("index.php?op=cad-tipo");
    }
    
    public function linkTipoProduto(TipoProduto &$tipo){
        global $config;
        $tipo->nome =  mb_strtoupper($config->filter("nome"), 'UTF-8');
    }
    
    public function removerTipoProduto(){
        global $config;
        $id_tipo = $config->filter("tipo");
        if(isset($id_tipo)){
            if($this->modelTipo->delete($id_tipo)){
                $config->successInFunction();
            } else {
                $config->failInFunction($this->modelTipo->handleError());
            }    
        } else {
            $config->failInFunction("Tipo de produto não informado");
        }
        $config->redirect("?op=cad-tipo");
    }
    
    public function getAllTiposProduto(){
        return $this->modelTipo->select();
    }
    
    public function getTipoProduto($id_tipo){
        $tipo = $this->modelTipo->select(" * ", TipoProdutoModel::ID." = $id_tipo");
        if(!empty($tipo)) return $tipo[0];
        return new TipoProduto();
    }
    
    //Ações relevantes ao model de Marcas de Produtos
    
    public function addMarca(Marca $marca = null){
        if(is_null($marca)){
            $marca = new Marca();
            $this->linkMarca($marca);
        }
        global $config;
        if(empty($marca->nome)){
            $config->failInFunction("O campo Nome é necessário para inserção");
            $config->redirect("?op=cad-marc");
        }
        
        $hasId = $config->filter("for-update-id");
        $res = false;
        
        if(empty($hasId)){
            $res = $this->modelMarca->insert($marca);
        } else {
            $marca->id = $hasId;
            $res = $this->modelMarca->update($marca);
        }
        
        if($res){
            $config->successInFunction();
        } else {
            $config->failInFunction($this->modelMarca->handleError());                
        }
        
        $config->redirect("index.php?op=cad-marc");
    }
    
    public function linkMarca(Marca &$marca){
        global $config;
        $marca->nome = mb_strtoupper($config->filter("nome"), 'UTF-8');
    }
    
    public function removerMarca(){
        global $config;
        $id_marca = $config->filter("marc");
        if(isset($id_marca)){
            if($this->modelMarca->delete($id_marca)){
                $config->successInFunction();
            } else {
                $config->failInFunction($this->modelMarca->handleError());
            }    
        } else {
            $config->failInFunction("Marca não informada");
        }
        $config->redirect("?op=cad-marc");
    }
    
    public function getAllMarcas(){
        return $this->modelMarca->select();
    }
    
    public function getMarca($id_marca){
        $marca = $this->modelMarca->select(" * ", MarcaModel::ID." = $id_marca");
        if(!empty($marca)) return $marca[0];
        return new Marca();   
    }
}
?>
